package net.lzzy.practices.repositonies;

import net.lzzy.practices.entities.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.UUID;

/**
 * @author admin
 */
public interface UserRepository extends JpaRepository<User, UUID> {
    /**
    * 使用用户名和密码到数据库匹配符合条件的记录
     * @param password
    * @param username
    *
    * @return java包装的对象
    *
    * */
//     User findUserByPasswordAndUserName(String password,String username);
    User findUserByUserNameAndPassword(String username,String password);
//     User findUserByPasswordAndUserName();

    /**
     * 查询用户名是否存在
     * @param user 判断用户是否存在
     * @return 是否大于0，如果大于0
     */
     Integer countByUserName(String user);

    /**
     * 查找符合条件的用户salt
     * @param username
     * @return salt
     */
     UserProjection getUserByUserName(String username);

    /**
     * 查找符合条件的用户salt
     * @param usernmae 查找的用户
     * @return salt
     */
     List<UserProjection> getUsersByUserName(String usernmae);

    /**
     * 根据时间倒序出分页用户记录
     * @return 所有用户记录
     */
     List<User> findAllByOrderByUpdateTimeDesc();

    /**
     * 根据时间倒叙列出分页用户。虽然没有过滤条件但是By 不能省，这是jpa的规则
     * @param pageable 分页参数，包括页码和每页大小
     * @return 按分页大小返沪用户记录
     */
     List<User> findAllByOrderByUpdateTimeDesc(Pageable pageable);
//
    /**
     * 返回所有用户数数据
     * @return 记录数
     */
     Integer countAllBy();

    /**
     * 查找申请教师资格的所有用户记录
     * @param apply 是否申请教师资格
     * @return 申请/未申请的用户
     */

//    Order(排序) By （根据什么东西排序） UpdateTime（）   Desc （倒叙）
    //根据 UpdataTiem 排序 ，结果是倒叙
     List<User> findUsersByApplyTeacherOrderByUpdateTimeDesc(boolean apply);



     //select * from users where user_name like '%123%' or nick_name like '%123%'
     //

    /**
     * 1.使用Query注解可进行自定义查询，而不限定与方法名的约定
     * 2.使用方式： ①添加注解②使用命名参数如:kw 表示该方法参数③使用jdql写语句，与sql规则基本一致但是表名和类名为实体类以及字段名
     * 3.参数绑定 :（占位符） kw 是，需要早方法参数中@PAram注解，将与其对应的占位符绑定
     * @param keyword 查询对应的内容
     * @return 返回符合条件的内容
     */
    @Query("select u from User u where u.userName like concat('%',:kw ,'%') or" +
            " u.nickName like concat('%',:kw ,'%') or " +
            " u.email like concat('%',:kw ,'%')")
    List<User> findByQuery(@Param("kw") String keyword);
}
